// WebSocket

var QuanJu = require('QuanJu');

var NetControl = new Object();

// 短连接
// identifier           :          消息命令
// data                 ：         数据
// callBack             ：         回调函数
// 例：
// NetControl.send('login', {"aa" : 1}, (data)=>{        
// });
NetControl.send = function (identifier, data, callBack) {
    cc.log("发送消息 ：" + identifier);
    var ws = new WebSocket(QuanJu.serverAddress);
    ws.onopen = function (msg) {
        var sendData = {
            "data": data,
        };
        if (QuanJu.userData != null && QuanJu.userData.id != null) {
            sendData.id = QuanJu.userData.id;
        }
        cc.log("发送了一条消息 ：" + identifier);
        var sendString = msgpack.pack(data);
        ws.send(sendString);
    };
    ws.onmessage = function(msg) {
        cc.log('收到一条回调消息: ' + msg.data);
        var data = msgpack.unpack(msg.data);
        if (data.identifier == identifier) {
            if (callBack != null) {
                callBack(data.data);
            }
            cc.log("close消息 ：" + identifier);
            ws.close();
        }
        else {
            cc.log('net:receive: ' + msg);
        }
    };
};

// 长连接
// identifier           :          消息命令
// data                 ：         数据
// callBack             ：         回调函数
// 例：
// NetControl.register('login', {"aa" : 1, "bb" : "xx"}, (data)=>{        
// });
NetControl.register = function (identifier, data, callBack) {
    cc.log("发送消息 ：" + identifier);
    var ws = new WebSocket(QuanJu.serverAddress);
    if (this.registeredList == null) {
        this.registeredList = {};
    }
    this.registeredList[identifier] = ws;
    ws.onopen = function (msg) {
        var sendData = {
            "identifier": identifier,
            'type': 'register',
            data: data,
        };
        if (QuanJu.userData != null && QuanJu.userData.id != null) {
            sendData.id = QuanJu.userData.id;
        }
        var sendString = msgpack.pack(sendData);
        cc.log("发送了一条消息 ：" + identifier);
        ws.send(sendString);
    };
    ws.onmessage = function(msg) {
        cc.log('收到一条回调消息: ' + msg.data);
        var data = msgpack.unpack(msg.data);
        if (callBack != null) {
            callBack(data);
        }
    };
    ws.onclose = ()=>{
        cc.log("close消息 ：" + identifier);
        this.registeredList[identifier] = null;
    };
};

// 删除单条长连接消息
// identifier           :          消息命令
// 例：
// NetControl.unRegister('login');
NetControl.unRegister = function (identifier) {
   cc.log("清楚查询消息 ：" + identifier);
    if (this.registeredList == null) return;
    if (this.registeredList[identifier] != null) {
        cc.log("清楚消息 ：" + identifier);
        if (this.registeredList[identifier].readyState == WebSocket.OPEN)
            this.registeredList[identifier].close();
        this.registeredList[identifier] = null;
    }
}

// 所有保存的长连接消息清空
// 例：
// NetControl.unRegisterAll();
NetControl.unRegisterAll = function () {
    cc.log("清楚所有本地消息 ：");
    if (this.registeredList == null) return;
    Object.keys(this.registeredList).forEach((identifier)=>{
        if (this.registeredList[identifier] != null) {
            cc.log("清楚本地消息 ：" + identifier);
            if (this.registeredList[identifier].readyState == WebSocket.OPEN)
                this.registeredList[identifier].close();
            this.registeredList[identifier] = null;
        }
    });
}

module.exports = NetControl;